首先來認識常見的錯誤類型:
當錯誤發生時,JavaScript 會停止執行,並產生錯誤訊息,通常會使用 try catch 搭配 throw 來建立自定義的錯誤訊息,而在 try catch 裡只能處理同步的錯誤,非同步處理錯誤將會在下一篇做介紹。
try 一定要搭配 catch 或 finally 來做使用,例如:try...catch
or try...finally
or try...catch...finally
。
語法:
try {
// 要執行的程式碼(預期可能會發生錯誤的程式碼)
// 如果發生錯誤,就停止 try 的程式碼,並將 error 拋給 catch 來處理
} catch (error) {
// 捕捉錯誤,若沒有錯誤,此區塊也可以省略
// 當 try 拋出 error 時,就執行 catch 區塊裡的程式碼
// catch 區塊的參數為一個 Error object
// Error object 有兩個屬性:name 和 message,name 為錯誤類型,message 為錯誤訊息
} finally {
// 可以省略 finally 區塊
// 無論最後結果如何,最後 finally 區塊的程式碼都會被執行
// (即使 try 或 catch 區塊有 return,也阻止不了 finally 區塊的執行)
}
例如:
try {
console.log(abc);
} catch (err) {
console.log(err.name);
console.log(err.message);
} finally {
console.log("程式碼執行結束");;
}
// ReferenceError
// abc is not defined
// 程式碼執行結束
上面的例子因為沒有宣告 abc 這個變數,找不到 abc,所以在 try 區塊裡,就會拋出錯誤訊息給 catch 區塊,這時候查看 catch 的錯誤訊息就可以看到錯誤類型為 ReferenceError,錯誤訊息為 abc is not defined,而最後會執行 finally 區塊裡的程式碼:程式碼執行結束。
throw new Error()
例如:
throw new Error("This is Error message.")
這時候我們查看 Devtool 可以發現這個錯誤訊息變成我們自己定義的內容了
也可以改變錯誤類型的預設訊息,例如:
try {
throw new ReferenceError("請不要忘記宣告變數");
console.log(abc);
} catch (err) {
console.log(err);
} finally {
console.log("程式碼執行結束");;
}
throw expression
例如:
try {
throw 'error message';
} catch (err) {
console.log(err); // error message
console.log(err.name); // undefined
console.log(err.message); // undefined
}
上面的例子要注意的是,因為建立的錯誤訊息是字串,所以這時候的錯誤訊息不是一個 Error object,沒有 name 和 message 屬性,查看 name 和 message 的時候就會顯示 undefined。
參考資料:
錯誤與例外處理 - 從ES6開始的JavaScript學習生活
流程控制與例外處理 - MDN
這時候的錯誤訊息不是一個 object,沒有 name 和 message 屬性
你好,請問文章中提到object有name跟 message屬性,是否願意提供資料出處呢~
感謝~
目前只知道 Error
物件本身有message,name等Properties
https://developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/error
Hi~我想你可能誤會我的意思,或者是我看不太懂你的問題
這時候的錯誤訊息不是一個 object,沒有 name 和 message 屬性
我的意思是:
因為上面的例子我寫了 throw 'error message'
,是丟出一個字串,而不是利用 constructor 建立 Error Object,所以裡面不會有 Error Object 的 name 和 message 屬性
希望有回答到你的問題~
感謝回覆
不好意思是我眼殘了XD
就想說沒聽過object有name這個Properties
原來是字串啊~~
啊,也恭喜要完賽了
哈哈哈沒事啦~我的表達不好,有稍微修改一下文章了哈哈
終於要完賽了><
你也加油呀!
祝你最後能追到小姐姐
XD
謝摟